obsah dvou souboru

Otázka od: Radek

8. 1. 2004 16:43

Ahoj,

 potreboval bych nejak jednoduse zjistit jestli je obsah dvou souboru stejny -
je na to nejaka finta ? Vypocitavat CRC
se me moc nechce.


Radek


Odpovedá: Petr Zahradnik

8. 1. 2004 16:57

Puvodni zprava ze dne 8.1.2004:

> potreboval bych nejak jednoduse zjistit jestli je obsah dvou
> souboru stejny - je na to nejaka finta ? Vypocitavat CRC

Hash - otisk dat.

> se me moc nechce.

A co by se ti chtelo?

Petr Zahradnik, pocitacovy expert

==========================================================
Petr Zahradnik, Computer Laboratory
Obvodova 740/14, 400 07 Usti nad Labem
telefon: 475 501 627, mobil: 602 409 601, fax: 475 511 338
web: http://www.clexpert.cz, e-mail: clexpert@clexpert.cz
ICQ: 21215917, MSN: clexpert@clexpert.cz
==========================================================


Odpovedá: Tomas Kminek

8. 1. 2004 18:01

> potreboval bych nejak jednoduse zjistit jestli je obsah dvou souboru
stejny - je na to nejaka finta ?

Tak tohle je bez finty:

function CompareFileContent(const Filename1, Filename2: String): Boolean;
var
  P1, P2: Pointer;
  hf, hm: THandle;
  size: DWORD;
begin
  Result := False;
  hf := FileOpen(FileName1, fmOpenRead or fmShareDenyNone);
  if hf = INVALID_HANDLE_VALUE then
    Raise Exception.CreateFmt('Cannot open %s', [FileName1]);
  size := GetFileSize (hf, nil);
  hm := CreateFileMapping(hf, nil, PAGE_READONLY, 0, 0, nil);
  CloseHandle (hf);
  if hm = 0 then
    raise Exception.Create('Cannot create file mapping.');
  P1:= MapViewOfFile (hm, FILE_MAP_READ, 0, 0, 0);
  CloseHandle (hm);
  if P1 = nil then
    raise Exception.Create('Cannot get file mapping.');

  {2. soubor}
  try
    hf := FileOpen(FileName2, fmOpenRead or fmShareDenyNone);
    if hf = INVALID_HANDLE_VALUE then
      Raise Exception.CreateFmt('Cannot open %s', [FileName1]);
    if size <> GetFileSize (hf, nil) then
    begin
      CloseHandle (hf);
      Exit;
    end;
    hm := CreateFileMapping(hf, nil, PAGE_READONLY, 0, 0, nil);
    CloseHandle (hf);
    if hm = 0 then
      raise Exception.Create('Cannot create file mapping.');
    P2:= MapViewOfFile (hm, FILE_MAP_READ, 0, 0, 0);
    CloseHandle (hm);
    if P2 = nil then
      raise Exception.Create('Cannot get file mapping.');

    try
      Result := CompareMem(P1, P2, size);
    finally
      UnmapViewOfFile (P2);
    end;
  finally
    UnmapViewOfFile (P1);
  end;
end;

TK


Odpovedá: Petr Brant

8. 1. 2004 17:30

Tak zkus pouzit hash - MD5 apod., muzu poslat zdrojak. Ale je v podstate
jedno, jestli nactes soubor a zavolas CRC1:= GetCRC(File1) anebo Hash1:=
MD5(File1). Kazdopadne musis soubor nejakym zpusobem nacist, to obejit
nepujde.

RNDr. Petr Brant [brant@dcomm.cz]
http://web.redbox.cz/petr.brant <http://web.redbox.cz/petr.brant>


> potreboval bych nejak jednoduse zjistit jestli je obsah dvou souboru
> stejny - je na to nejaka finta ? Vypocitavat CRC
> se me moc nechce.
>

Odpovedá: Karel Rys

8. 1. 2004 18:32

Petr Brant dne 8 Jan 2004 v 17:05:

> Tak zkus pouzit hash - MD5 apod., muzu poslat zdrojak. Ale je v
> podstate jedno, jestli nactes soubor a zavolas CRC1:= GetCRC(File1)
> anebo Hash1:= MD5(File1). Kazdopadne musis soubor nejakym zpusobem
> nacist, to obejit nepujde.

Spise bych se drzel toho, co poslal p. Kminek - nejsou tam vypocty navic, bude
to rychlejsi. Navic
pokud to zjistit rozdil na 1. bajtu, nebude to zbytecne nacitat a pocitat cely
(stomegovy...)
soubor.

Karel Rys


Odpovedá: Jan Fiala

8. 1. 2004 18:14

8.1.2004 Karel Rys:
 Spise bych se drzel toho, co poslal p. Kminek - nejsou tam
> vypocty navic, bude to rychlejsi. Navic
> pokud to zjistit rozdil na 1. bajtu, nebude to zbytecne nacitat a pocitat
cely (stomegovy...)
> soubor.

Jeste bych tam udelal napred podminku na porovnani velikosti obou
souboru. K tomu nemusis taky soubory nacitat a muzes si usetrit
mapovani.

--
Jan Fiala
mailto:jan.fiala@wo.cz